package com.ruifu.conversions.service.impl;


import com.github.tobato.fastdfs.domain.StorePath;
import com.github.tobato.fastdfs.service.FastFileStorageClient;
import com.ruifu.common.config.FileType;
import com.ruifu.common.eneity.ConversionTaskQueue;
import com.ruifu.common.po.DmFile;
import com.ruifu.common.utils.FileUtils;
import com.ruifu.conversions.mapper.DmFileMapper;
import com.ruifu.conversions.service.FileConversionService;
import com.ruifu.conversions.utils.Dwg4Pdf;
import com.ruifu.conversions.utils.ExcelToPdfUtil;
import com.ruifu.conversions.utils.FastDFSClient;
import com.ruifu.conversions.utils.Office4Pdf;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.io.FilenameUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;


/**
 * @author lcq
 * @date 2019/9/17
 */
@Service
@Slf4j
public class FileConversionServiceImpl implements FileConversionService {
    @Autowired
    private FastDFSClient fastDFSClient;

    @Autowired(required = false)
    private DmFileMapper dmFileMapper;

    @Autowired
    private FastFileStorageClient storageClient;
    @Autowired
    Office4Pdf office4Pdf;

    /**
     * 文件转换
     *
     * @param conversionTaskQueue
     * @throws Exception
     */
    @Override
    public void conversionFileUpload(ConversionTaskQueue conversionTaskQueue){
        //判断文件对象是否为空
        if (conversionTaskQueue.getDmFile() == null) {
            throw new RuntimeException("文件对象为空");
        }
        byte[] bytes = new byte[0];
        try {
            //根据文件路径得到文件数组
            bytes = fastDFSClient.copyFile(conversionTaskQueue.getDmFile().getFiStorPath());
        } catch (Exception e) {
            e.printStackTrace();
        }
        //Byte数组转File
        File sourceFile = FileUtils.ByteToFile(bytes, conversionTaskQueue.getDmFile().getFiFileName());

        //获取文件后缀
        String extName = FilenameUtils.getExtension(sourceFile.getName());
        log.info("文件后缀"+extName);

        //判断源文件后缀是否为xls
        if (FileType.XLSX.equalsIgnoreCase(extName) || FileType.XLS.equalsIgnoreCase(extName)){
            try {
                byte[] xlsByte = ExcelToPdfUtil.excel2pdf(bytes);
                String substring = conversionTaskQueue.getDmFile().getFiFileName()
                        .substring(0, conversionTaskQueue.getDmFile().getFiFileName().indexOf(".")+1);
                File xlsToFile = FileUtils.ByteToFile(xlsByte, substring+FileType.PDF);
                //上传文件
                StorePath storePath = getFilePath(sourceFile, xlsToFile);
                InitializeFile(conversionTaskQueue, xlsToFile, storePath);
            } catch (IOException e) {
                e.printStackTrace();
                log.error("xsl文件转换出错");
            }
                //判断源文件后缀是否为dwg
        }else if (FileType.DWG.equalsIgnoreCase(extName)){
            try {
                //dwg文件转换为pdf文件
                File dwgFile = Dwg4Pdf.Dwg2Pdf(sourceFile);
                //上传文件
                StorePath storePath = getFilePath(sourceFile, dwgFile);
                InitializeFile(conversionTaskQueue, dwgFile, storePath);
            } catch (IOException e) {
                e.printStackTrace();
                log.error("dwg文件转换出错");
            }
        }else {
                try {
                    //office文件转换为pdf文件
                    File pdfFile = office4Pdf.Office2Pdf(sourceFile);
                    //上传文件
                    StorePath storePath = getFilePath(sourceFile, pdfFile);
                    InitializeFile(conversionTaskQueue, pdfFile, storePath);
                } catch (Exception e) {
                    e.printStackTrace();
                    log.error("office文件转换出错");
                }

        }

    }

    private StorePath getFilePath(File sourceFile, File file) {
        if (file.exists()) {
            log.info(file.getName()+"文件转换完成");
            //删除源文件
            if (sourceFile.exists()) {
                if (sourceFile.delete()){
                    log.info(sourceFile.getName()+"源文件删除成功");
                }
            }else {
                log.info(sourceFile.getName()+"源文件删除失败");
            }
        }
        FileInputStream fileInputStream = null;
        try {
            //将pdf文件转换成InputStream输入流
            fileInputStream = new FileInputStream(file);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
        log.info("文件大小："+file.length());
        //以流的形式上传PDF到文件服务器
        StorePath storePath = storageClient.uploadFile(fileInputStream, file.length(), FilenameUtils.getExtension(file.getName()), null);
        //关闭流
        try {
            fileInputStream.close();

        } catch (IOException e) {
            e.printStackTrace();
        }
        return storePath;
    }

    private void InitializeFile(ConversionTaskQueue conversionTaskQueue, File file, StorePath storePath) {
        DmFile dmFile = new DmFile();
        //父文件id
        dmFile.setFiPFileId(conversionTaskQueue.getDmFile().getFiFileId());
        //文件关联类型
        dmFile.setFiStrType(4);
        //文件名
        dmFile.setFiFileName(file.getName());
        //是否被压缩
        dmFile.setFiIsCompresSed(false);
        //文件大小
        dmFile.setFiFileSize(conversionTaskQueue.getDmFile().getFiFileSize());
        //所在数据仓ID号
        dmFile.setFiVaultId(storePath.getGroup());
        //存储方式
        dmFile.setFiStorType(3);
        //存储路径
        dmFile.setFiStorPath(storePath.getFullPath());
        //创建人
        dmFile.setFiCreator(conversionTaskQueue.getDmFile().getFiCreator());
        //最后修改人
        dmFile.setFiLastUpdator(conversionTaskQueue.getDmFile().getFiLastUpdator());
        //所有者
        dmFile.setFiOwner(conversionTaskQueue.getDmFile().getFiOwner());
        //部门id
        dmFile.setFiOrgId(conversionTaskQueue.getDmFile().getFiOrgId());
        //账套
        dmFile.setFiSetSid(conversionTaskQueue.getDmFile().getFiSetSid());
        //新增
        dmFileMapper.insert(dmFile);
        log.info(dmFile.getFiFileName()+"预览文件新建成功");
        //删除临时文件
        if (file.delete()) {
            log.info(file.getName()+"临时文件删除成功");
        } else {
            log.info(file.getName()+"临时文件删除失败");
        }
    }


}
